Run download_data.Rmd and percentage_of_regional_richness.Rmd First!

city_data
length(city_data$city_gdp_per_population[!is.na(city_data$city_gdp_per_population)])
[1] 30
length(city_data$percentage_urban_area_as_open_public_spaces[!is.na(city_data$percentage_urban_area_as_open_public_spaces)])
[1] 61
length(city_data$happiness_future_life[!is.na(city_data$happiness_future_life)])
[1] 65
length(city_data$mean_population_exposure_to_pm2_5_2019[!is.na(city_data$mean_population_exposure_to_pm2_5_2019)])
[1] 131
fetch_city_data_for <- function(pool_name, include_city_name = F, include_pool_size = T) {
  results_filename <- paste(paste('percentage_of_regional_richness__output_', pool_name, 'city', 'richness', 'intercept', sep = "_"), "csv", sep = ".")
  results <- read_csv(results_filename)
  
  joined <- left_join(city_data, results)
  
  pool_size_col_name <- paste(pool_name, 'pool', 'size', sep = "_")
  
  required_columns <- c("population_growth", "rainfall_monthly_min", "rainfall_annual_average", "rainfall_monthly_max", "temperature_annual_average", "temperature_monthly_min", "temperature_monthly_max", "happiness_negative_effect", "happiness_positive_effect", "happiness_future_life", "number_of_biomes", "realm", "biome_name", "region_20km_includes_estuary", "region_50km_includes_estuary", "region_100km_includes_estuary", "city_includes_estuary", "region_20km_average_pop_density", "region_50km_average_pop_density", "region_100km_average_pop_density", "city_max_pop_density", "city_average_pop_density", "mean_population_exposure_to_pm2_5_2019", "region_20km_cultivated", "region_20km_urban", "region_50km_cultivated", "region_50km_urban", "region_100km_cultivated", "region_100km_urban", "region_20km_elevation_delta", "region_20km_mean_elevation", "region_50km_elevation_delta", "region_50km_mean_elevation", "region_100km_elevation_delta", "region_100km_mean_elevation", "city_elevation_delta", "city_mean_elevation", "urban", "shrubs", "permanent_water", "open_forest", "herbaceous_wetland", "herbaceous_vegetation", "cultivated", "closed_forest", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_streets", "percentage_urban_area_as_open_public_spaces_and_streets", "percentage_urban_area_as_open_public_spaces", "city_gdp_per_population", "city_ndvi", "city_ssm", "city_susm", "region_20km_ndvi", "region_20km_ssm", "region_20km_susm", "region_50km_ndvi", "region_50km_ssm", "region_50km_susm", "region_100km_ndvi", "region_100km_ssm", "region_100km_susm", "city_percentage_protected", "region_20km_percentage_protected", "region_50km_percentage_protected", "region_100km_percentage_protected")
  
  if (include_pool_size) {
    required_columns <- append(c(pool_size_col_name), required_columns)
  }
  
  if (include_city_name) {
    required_columns <- append(c("name"), required_columns)
  }
  
  required_columns <- append(c("response"), required_columns)
  
  joined[,required_columns]
}
merlin_city_data <- fetch_city_data_for('merlin')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
merlin_city_data

library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.
library(reshape2)
library(rpart)
library(ggplot2)

Attaching package: ‘ggplot2’

The following object is masked from ‘package:randomForest’:

    margin
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ tibble  3.1.2     ✓ dplyr   1.0.7
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::combine()  masks randomForest::combine()
x dplyr::filter()   masks stats::filter()
x dplyr::lag()      masks stats::lag()
x ggplot2::margin() masks randomForest::margin()
library(multcomp)
Loading required package: mvtnorm
Loading required package: survival
Loading required package: TH.data
Loading required package: MASS

Attaching package: ‘MASS’

The following object is masked from ‘package:dplyr’:

    select


Attaching package: ‘TH.data’

The following object is masked from ‘package:MASS’:

    geyser
library(car)
Loading required package: carData
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'car':
  method                          from
  influence.merMod                lme4
  cooks.distance.influence.merMod lme4
  dfbeta.influence.merMod         lme4
  dfbetas.influence.merMod        lme4

Attaching package: ‘car’

The following object is masked from ‘package:dplyr’:

    recode

The following object is masked from ‘package:purrr’:

    some
merlin_city_data_fixed <- rfImpute(response ~ ., merlin_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    16.87    93.56 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    17.14    95.06 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    16.85    93.46 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    17.32    96.08 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    16.91    93.80 |
merlin_city_data_fixed

source('./helper__random_forest_selection_functions.R')
scale_parameter_name <- function(scale, postscript) {
  paste('region', paste(scale, 'km', sep = ''), postscript, sep = '_')  
}

scale_parameters <- function(postscript) {
  c(scale_parameter_name(20, postscript), scale_parameter_name(50, postscript), scale_parameter_name(100, postscript))
}

scales_parameters_without <- function(scale_to_exclude, postscript) {
  scales <- scale_parameters(postscript)
  scales[scales != scale_parameter_name(scale_to_exclude, postscript)]
}

select_scales <- function(urban, cultivated, elevation_delta, mean_elevation, average_pop_density, includes_estuary, ssm, susm, ndvi, percentage_protected) {
  append(
    append(
      append(
        append(
          scales_parameters_without(scale_to_exclude = urban, postscript = 'urban'),
          scales_parameters_without(scale_to_exclude = cultivated, postscript = 'cultivated')
        ),
        append(
          scales_parameters_without(scale_to_exclude = elevation_delta, postscript = 'elevation_delta'),
          scales_parameters_without(scale_to_exclude = mean_elevation, postscript = 'mean_elevation')
        )
      ),
      append(
        append(
          scales_parameters_without(scale_to_exclude = average_pop_density, postscript = 'average_pop_density'),
          scales_parameters_without(scale_to_exclude = includes_estuary, postscript = 'includes_estuary')
        ),
        append(
          scales_parameters_without(scale_to_exclude = ssm, postscript = 'ssm'),
          scales_parameters_without(scale_to_exclude = susm, postscript = 'susm')
        )
      )
    ),
    append(
      scales_parameters_without(scale_to_exclude = ndvi, postscript = 'ndvi'),
      scales_parameters_without(scale_to_exclude = percentage_protected, postscript = 'percentage_protected')
    )
  )
}
select_scales(urban = 20, cultivated = 100, elevation_delta = 20, mean_elevation = 100, average_pop_density = NA, includes_estuary = NA, ssm = 20, susm = 20, ndvi = 100, percentage_protected = NA)
 [1] "region_50km_urban"                 "region_100km_urban"               
 [3] "region_20km_cultivated"            "region_50km_cultivated"           
 [5] "region_50km_elevation_delta"       "region_100km_elevation_delta"     
 [7] "region_20km_mean_elevation"        "region_50km_mean_elevation"       
 [9] "region_20km_average_pop_density"   "region_50km_average_pop_density"  
[11] "region_100km_average_pop_density"  "region_20km_includes_estuary"     
[13] "region_50km_includes_estuary"      "region_100km_includes_estuary"    
[15] "region_50km_ssm"                   "region_100km_ssm"                 
[17] "region_50km_susm"                  "region_100km_susm"                
[19] "region_20km_ndvi"                  "region_50km_ndvi"                 
[21] "region_20km_percentage_protected"  "region_50km_percentage_protected" 
[23] "region_100km_percentage_protected"

select_scales(urban = , cultivated = , elevation_delta = , mean_elevation = , average_pop_density = , includes_estuary = , ssm = , susm = , ndvi =, percentage_protected = )

select_variables_from_random_forest(merlin_city_data_fixed)
 [1] "merlin_pool_size"                                       
 [2] "biome_name"                                             
 [3] "realm"                                                  
 [4] "region_100km_ssm"                                       
 [5] "region_50km_elevation_delta"                            
 [6] "region_20km_elevation_delta"                            
 [7] "temperature_monthly_min"                                
 [8] "region_50km_ssm"                                        
 [9] "city_gdp_per_population"                                
[10] "temperature_annual_average"                             
[11] "region_50km_susm"                                       
[12] "region_20km_urban"                                      
[13] "rainfall_monthly_min"                                   
[14] "permanent_water"                                        
[15] "region_100km_elevation_delta"                           
[16] "region_50km_urban"                                      
[17] "region_20km_cultivated"                                 
[18] "region_100km_cultivated"                                
[19] "shrubs"                                                 
[20] "happiness_positive_effect"                              
[21] "region_20km_ndvi"                                       
[22] "share_of_population_within_400m_of_open_space"          
[23] "city_percentage_protected"                              
[24] "herbaceous_wetland"                                     
[25] "region_100km_urban"                                     
[26] "region_50km_cultivated"                                 
[27] "region_20km_average_pop_density"                        
[28] "region_50km_average_pop_density"                        
[29] "temperature_monthly_max"                                
[30] "city_max_pop_density"                                   
[31] "region_100km_average_pop_density"                       
[32] "city_mean_elevation"                                    
[33] "city_ndvi"                                              
[34] "city_average_pop_density"                               
[35] "rainfall_monthly_max"                                   
[36] "happiness_future_life"                                  
[37] "region_20km_susm"                                       
[38] "region_50km_percentage_protected"                       
[39] "mean_population_exposure_to_pm2_5_2019"                 
[40] "city_susm"                                              
[41] "region_100km_susm"                                      
[42] "city_elevation_delta"                                   
[43] "region_50km_ndvi"                                       
[44] "region_100km_percentage_protected"                      
[45] "region_20km_ssm"                                        
[46] "region_20km_percentage_protected"                       
[47] "rainfall_annual_average"                                
[48] "region_20km_mean_elevation"                             
[49] "percentage_urban_area_as_open_public_spaces_and_streets"
[50] "urban"                                                  
[51] "region_100km_ndvi"                                      
[52] "city_ssm"                                               
[53] "cultivated"                                             
[54] "region_50km_mean_elevation"                             
[55] "region_100km_mean_elevation"                            
[56] "population_growth"                                      
[57] "happiness_negative_effect"                              
[58] "percentage_urban_area_as_streets"                       
[59] "closed_forest"                                          
[60] "open_forest"                                            
[61] "percentage_urban_area_as_open_public_spaces"            
exclude_merlin <- !names(merlin_city_data_fixed) %in% select_scales(urban = 20, cultivated = 100, elevation_delta = 50, mean_elevation = 20, average_pop_density = 50, includes_estuary = NA, ssm = 100, susm = 50, ndvi = 20, percentage_protected = 50)

merlin_city_data_fixed_single_scale <- merlin_city_data_fixed[,exclude_merlin]
merlin_city_data_fixed_single_scale
select_variables_from_random_forest(merlin_city_data_fixed_single_scale)
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max", "city_average_pop_density")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max", "city_average_pop_density", "region_50km_average_pop_density")])
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "merlin_pool_size", "biome_name", "realm", "region_100km_ssm", "temperature_annual_average", "temperature_monthly_min", "region_50km_elevation_delta",  "rainfall_monthly_min", "permanent_water", "region_50km_susm", "region_20km_ndvi", "region_20km_urban", "shrubs",  "city_gdp_per_population", "happiness_positive_effect", "city_percentage_protected", "region_100km_cultivated", "share_of_population_within_400m_of_open_space", "rainfall_monthly_max", "city_ndvi", "temperature_monthly_max", "city_average_pop_density", "region_50km_average_pop_density", "rainfall_annual_average")])

“merlin_pool_size”, “biome_name”, “realm”

birdlife_city_data <- fetch_city_data_for('birdlife')
birdlife_city_data
ggplot(birdlife_city_data, aes(response)) + geom_histogram(binwidth = 1)
birdlife_city_data_fixed <- rfImpute(response ~ ., birdlife_city_data)
birdlife_city_data_fixed
select_variables_from_random_forest(birdlife_city_data_fixed)
exclude_birdlife <- !names(birdlife_city_data_fixed) %in% select_scales(urban = 100, cultivated = 100, elevation_delta = 20, mean_elevation = 100, average_pop_density = 20, includes_estuary = NA, ssm = 50, susm = 100, ndvi = 100, percentage_protected = 100)

birdlife_city_data_fixed_single_scale <- birdlife_city_data_fixed[,exclude_birdlife]
birdlife_city_data_fixed_single_scale
select_variables_from_random_forest(birdlife_city_data_fixed_single_scale)
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average", "city_susm")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average", "city_susm", "region_100km_ndvi")])
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "birdlife_pool_size", "biome_name", "region_100km_cultivated", "city_ndvi", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces", "rainfall_monthly_min", "region_100km_susm", "region_20km_average_pop_density", "city_ssm", "permanent_water", "rainfall_monthly_max", "region_100km_urban", "temperature_annual_average", "percentage_urban_area_as_open_public_spaces_and_streets", "region_20km_elevation_delta", "share_of_population_within_400m_of_open_space", "shrubs", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "percentage_urban_area_as_streets", "rainfall_annual_average", "city_susm", "region_100km_ndvi", "happiness_future_life")])

“population_growth”, “region_50km_ssm”, “birdlife_pool_size”

So….
Merlin: “merlin_pool_size”, “biome_name”, “realm” Birdlife: “population_growth”, “region_50km_ssm”, “birdlife_pool_size”

Try Modelling

library(boot)

Attaching package: ‘boot’

The following object is masked from ‘package:car’:

    logit

The following object is masked from ‘package:survival’:

    aml
merlin_city_data_named <- fetch_city_data_for('merlin', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
birdlife_city_data_named <- fetch_city_data_for('birdlife', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
Use cross validation and dropping terms to find best model
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.51828

– Can we drop one?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.8059
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.46984
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + population_growth + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.39671
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.30384
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 20.17595

– drop populaion_growth (14.30384)

– can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + region_50km_ssm + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.56925
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + region_50km_ssm + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.24412
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 14.20889
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 20.17595

– drop ssm (14.20889)

– can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.38282
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.10131
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ biome_name + realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 20.56763

– drop biome (13.10131)

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.29241
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.48513
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ merlin_pool_size * realm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 13.85502
– best model with merlin is pool size + realm (CV error 13.10131)
merlin_city_data_fixed$realm <- factor(merlin_city_data_fixed$realm, levels = c("Palearctic", "Nearctic", "Australasia", "Indomalayan", "Neotropic", "Afrotropic"))
summary(glm(data = merlin_city_data_fixed, formula = response ~ merlin_pool_size + realm))

Call:
glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-8.5046  -1.6225  -0.5191   1.4001  16.3762  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)       6.155064   0.927938   6.633 8.03e-10 ***
merlin_pool_size -0.028445   0.003408  -8.346 9.02e-14 ***
realmNearctic     3.089566   1.035703   2.983  0.00341 ** 
realmAustralasia -0.304872   2.107524  -0.145  0.88520    
realmIndomalayan  1.888475   0.823167   2.294  0.02339 *  
realmNeotropic    3.355053   0.997078   3.365  0.00101 ** 
realmAfrotropic   1.602668   1.215952   1.318  0.18981    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 12.36947)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 1608.0  on 130  degrees of freedom
AIC: 742.19

Number of Fisher Scoring iterations: 2
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + biome_name + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.817509

– can we drop a variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + biome_name, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.1237
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.492536
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + biome_name + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.764969
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + region_50km_ssm + biome_name + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.666362
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ population_growth + region_50km_ssm + biome_name + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 7.061169

– drop biome (5.492536)

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.686036
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + population_growth + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.499406
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.38609
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ population_growth + region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.690224

– drop population growth (5.38609)

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + region_50km_ssm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.577701
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.38033
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.637624

– drop ssm (5.38033)

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 5.613765
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.746644
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ birdlife_pool_size * realm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
– so best model with birdlife is pool size + realm
summary(glm(data = birdlife_city_data_fixed, formula = response ~ birdlife_pool_size + realm))

Call:
glm(formula = response ~ birdlife_pool_size + realm, data = birdlife_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-5.9219  -1.2809  -0.3423   0.8298   9.5036  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         3.16482    0.64778   4.886 2.98e-06 ***
birdlife_pool_size -0.01493    0.00252  -5.926 2.62e-08 ***
realmNearctic       0.58805    0.63743   0.923  0.35796    
realmAustralasia    1.04651    1.38301   0.757  0.45060    
realmIndomalayan    1.87907    0.60496   3.106  0.00233 ** 
realmNeotropic      2.26051    0.70591   3.202  0.00171 ** 
realmAfrotropic     2.54804    0.89206   2.856  0.00499 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 5.241433)

    Null deviance: 865.45  on 136  degrees of freedom
Residual deviance: 681.39  on 130  degrees of freedom
AIC: 624.56

Number of Fisher Scoring iterations: 2
summary(glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed_no_boreal))

Call:
glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed_no_boreal)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-8.5389  -1.7132  -0.5164   1.3898  16.2335  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)       7.823312   1.406157   5.564 1.46e-07 ***
merlin_pool_size -0.028685   0.003401  -8.434 5.79e-14 ***
realmAustralasia -1.923665   2.294340  -0.838    0.403    
realmIndomalayan  0.288224   1.193798   0.241    0.810    
realmNearctic     1.499468   1.327678   1.129    0.261    
realmNeotropic    1.767199   1.293308   1.366    0.174    
realmPalearctic  -1.490884   1.214536  -1.228    0.222    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 12.28537)

    Null deviance: 2458.9  on 135  degrees of freedom
Residual deviance: 1584.8  on 129  degrees of freedom
AIC: 735.91

Number of Fisher Scoring iterations: 2
ggplot(merlin_city_data_fixed_no_boreal, aes(x = merlin_pool_size, y = response)) + geom_point() + geom_smooth(method = "glm", se = F) + facet_wrap(~ realm)
`geom_smooth()` using formula 'y ~ x'

ggplot(birdlife_city_data_fixed_no_boreal, aes(x = birdlife_pool_size, y = response)) + geom_point() + geom_smooth(method = "glm", se = F) + facet_wrap(~ realm)
`geom_smooth()` using formula 'y ~ x'

birdlife.fit <- glm(data = birdlife_city_data_fixed_no_boreal, formula = response ~ birdlife_pool_size + realm)
summary(birdlife.fit)

Call:
glm(formula = response ~ birdlife_pool_size + realm, data = birdlife_city_data_fixed_no_boreal)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-5.9240  -1.2855  -0.3158   0.8601   9.4227  

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         5.724170   1.182215   4.842 3.61e-06 ***
birdlife_pool_size -0.014963   0.002513  -5.955 2.31e-08 ***
realmAustralasia   -1.504499   1.508076  -0.998  0.32033    
realmIndomalayan   -0.670291   0.785239  -0.854  0.39490    
realmNearctic      -1.963875   0.918121  -2.139  0.03432 *  
realmNeotropic     -0.288102   0.832533  -0.346  0.72987    
realmPalearctic    -2.474092   0.891147  -2.776  0.00632 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 5.210381)

    Null deviance: 857.07  on 135  degrees of freedom
Residual deviance: 672.14  on 129  degrees of freedom
AIC: 619.25

Number of Fisher Scoring iterations: 2
with(summary(birdlife.fit), 1 - deviance/null.deviance)
[1] 0.2157718
plot(birdlife.fit)

birdlife_city_data_fixed_no_boreal[c(16, 53, 116, 123), c("name", "birdlife_pool_size")]
ggplot(birdlife_city_data_fixed_no_boreal, aes(x = birdlife_pool_size, y = response)) + 
  geom_point(size=1) + 
  geom_smooth(method = "glm", se = F) +
  geom_text(aes(label = name), data = birdlife_city_data_fixed_no_boreal[c(16, 53, 123),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
  geom_point(data = birdlife_city_data_fixed_no_boreal[c(16, 53, 123),], color = "red") +
  facet_wrap(~ realm) +
  theme_bw() +
  ylab("City Random Effect Intercept") + xlab("Regional Pool Size") + labs(title = "Birdlife")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness__output__birdlife.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

merlin.fit <- glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ merlin_pool_size + realm)
summary(merlin.fit)

Call:
glm(formula = response ~ merlin_pool_size + realm, data = merlin_city_data_fixed_no_boreal)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-8.5389  -1.7132  -0.5164   1.3898  16.2335  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)       7.823312   1.406157   5.564 1.46e-07 ***
merlin_pool_size -0.028685   0.003401  -8.434 5.79e-14 ***
realmAustralasia -1.923665   2.294340  -0.838    0.403    
realmIndomalayan  0.288224   1.193798   0.241    0.810    
realmNearctic     1.499468   1.327678   1.129    0.261    
realmNeotropic    1.767199   1.293308   1.366    0.174    
realmPalearctic  -1.490884   1.214536  -1.228    0.222    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 12.28537)

    Null deviance: 2458.9  on 135  degrees of freedom
Residual deviance: 1584.8  on 129  degrees of freedom
AIC: 735.91

Number of Fisher Scoring iterations: 2
with(summary(merlin.fit), 1 - deviance/null.deviance)
[1] 0.3554797
plot(merlin.fit)

city_data[c(7, 24, 77), c("name", "birdlife_pool_size", "merlin_pool_size")]
ggplot(merlin_city_data_fixed_no_boreal, aes(x = merlin_pool_size, y = response)) + 
  geom_point(size = 1) + 
  geom_smooth(method = "glm", se = F) +
  geom_text(aes(label = name), data = merlin_city_data_fixed_no_boreal[c(7, 24, 77),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
  geom_point(data = merlin_city_data_fixed_no_boreal[c(7, 24, 77),], color = "red") +
  facet_wrap(~ realm) +
  theme_bw() +
  ylab("City Random Effect Intercept") + xlab("Regional Pool Size") + labs(title = "eBird")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness__output__merlin.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

merlin_city_data_fixed_no_boreal$residuals <- resid(merlin.fit)
ggplot(merlin_city_data_fixed_no_boreal, aes(y = response, x = residuals)) + 
  geom_smooth(method = "lm", se = F) +
  geom_point(aes(color = realm)) + 
  geom_text(aes(label = name), data = merlin_city_data_fixed_no_boreal[c(7, 24, 77),], size = 4, position = "dodge", vjust = "inward", hjust = "inward") + 
  labs(title = "Merlin", subtitle = paste("Correlation", cor(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$response))) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

birdlife_city_data_fixed_no_boreal$residuals <- resid(birdlife.fit)
ggplot(birdlife_city_data_fixed_no_boreal, aes(y = response, x = residuals)) + 
  geom_smooth(method = "lm", se = F, alpha = 0.5) +
  geom_point(aes(color = realm)) + 
  geom_text(aes(label = name), data = birdlife_city_data_fixed_no_boreal[c(16, 53, 124),], size = 4, position = "dodge", vjust = "inward", hjust = "inward") +
  labs(title = "Birdlife", subtitle = paste("Correlation", cor(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$response))) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

birdlife_city_data_fixed_no_boreal$residuals_of_fit <- resid(lm(response ~ residuals, birdlife_city_data_fixed_no_boreal))
ggplot(birdlife_city_data_fixed_no_boreal, aes(x = realm, y = residuals_of_fit)) + geom_boxplot()

birdlife.aov <- aov(birdlife_city_data_fixed_no_boreal$residuals_of_fit ~ birdlife_city_data_fixed_no_boreal$realm)
summary(birdlife.aov)
                                          Df Sum Sq Mean Sq F value Pr(>F)
birdlife_city_data_fixed_no_boreal$realm   5   0.16  0.0315   0.022      1
Residuals                                130 184.77  1.4213               
merlin_city_data_fixed_no_boreal$residuals_of_fit <- resid(lm(response ~ residuals, merlin_city_data_fixed_no_boreal))
ggplot(merlin_city_data_fixed_no_boreal, aes(x = realm, y = residuals_of_fit)) + geom_boxplot()

merlin.aov <- aov(merlin_city_data_fixed_no_boreal$residuals_of_fit ~ merlin_city_data_fixed_no_boreal$realm)
summary(merlin.aov)
                                        Df Sum Sq Mean Sq F value Pr(>F)
merlin_city_data_fixed_no_boreal$realm   5    0.2   0.040   0.006      1
Residuals                              130  873.9   6.722               
ggplot(merlin_city_data_fixed_no_boreal, aes(residuals)) + geom_histogram(binwidth = 1)

ggplot(birdlife_city_data_fixed_no_boreal, aes(residuals)) + geom_histogram(binwidth = 1)

shapiro.test(birdlife_city_data_fixed_no_boreal$response)

    Shapiro-Wilk normality test

data:  birdlife_city_data_fixed_no_boreal$response
W = 0.93733, p-value = 8.842e-06
shapiro.test(birdlife_city_data_fixed_no_boreal$residuals)

    Shapiro-Wilk normality test

data:  birdlife_city_data_fixed_no_boreal$residuals
W = 0.94253, p-value = 2.095e-05
shapiro.test(birdlife_city_data_fixed_no_boreal$residuals_of_fit)

    Shapiro-Wilk normality test

data:  birdlife_city_data_fixed_no_boreal$residuals_of_fit
W = 0.90395, p-value = 7.391e-08
shapiro.test(merlin_city_data_fixed_no_boreal$response)

    Shapiro-Wilk normality test

data:  merlin_city_data_fixed_no_boreal$response
W = 0.95308, p-value = 0.0001366
shapiro.test(merlin_city_data_fixed_no_boreal$residuals)

    Shapiro-Wilk normality test

data:  merlin_city_data_fixed_no_boreal$residuals
W = 0.93318, p-value = 4.568e-06
shapiro.test(merlin_city_data_fixed_no_boreal$residuals_of_fit)

    Shapiro-Wilk normality test

data:  merlin_city_data_fixed_no_boreal$residuals_of_fit
W = 0.94707, p-value = 4.596e-05

Variances of groups are NOT significantly different:

bartlett.test(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$realm) 

    Bartlett test of homogeneity of variances

data:  merlin_city_data_fixed_no_boreal$residuals and merlin_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 12.245, df = 5, p-value = 0.03159
leveneTest(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$realm) 
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   5    1.22 0.3033
      130               

Variances of groups are NOT significantly different:

bartlett.test(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$realm) 

    Bartlett test of homogeneity of variances

data:  birdlife_city_data_fixed_no_boreal$residuals and birdlife_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 16.504, df = 5, p-value = 0.005544
leveneTest(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$realm) 
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   5  1.4422 0.2134
      130               

Variances of groups are significantly different:

bartlett.test(merlin_city_data_fixed_no_boreal$residuals_of_fit, merlin_city_data_fixed_no_boreal$realm) 

    Bartlett test of homogeneity of variances

data:  merlin_city_data_fixed_no_boreal$residuals_of_fit and merlin_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 63.781, df = 5, p-value = 2.006e-12
leveneTest(merlin_city_data_fixed_no_boreal$residuals_of_fit, merlin_city_data_fixed_no_boreal$realm) 
Levene's Test for Homogeneity of Variance (center = median)
       Df F value    Pr(>F)    
group   5  7.1996 5.587e-06 ***
      130                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Variances of groups are significantly different:

bartlett.test(birdlife_city_data_fixed_no_boreal$residuals_of_fit, birdlife_city_data_fixed_no_boreal$realm) 

    Bartlett test of homogeneity of variances

data:  birdlife_city_data_fixed_no_boreal$residuals_of_fit and birdlife_city_data_fixed_no_boreal$realm
Bartlett's K-squared = 77.857, df = 5, p-value = 2.355e-15
leveneTest(birdlife_city_data_fixed_no_boreal$residuals_of_fit, birdlife_city_data_fixed_no_boreal$realm) 
Levene's Test for Homogeneity of Variance (center = median)
       Df F value    Pr(>F)    
group   5  9.9859 4.199e-08 ***
      130                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Check AIC
AIC(
  glm(data = merlin_city_data_fixed, formula = response ~ merlin_pool_size + population_growth + region_50km_ssm + biome_name + realm),
  glm(data = merlin_city_data_fixed, formula = response ~ merlin_pool_size + realm)
)
AIC(
  glm(data = birdlife_city_data_fixed, formula = response ~ birdlife_pool_size + population_growth + region_50km_ssm + biome_name + realm),
  glm(data = birdlife_city_data_fixed, formula = response ~ birdlife_pool_size + realm)
)
Compare outliers between two pool sizes
ggplot(city_data, aes(x = merlin_pool_size, y = birdlife_pool_size)) + 
  geom_point() +
  geom_smooth(se = F, method = "lm") +
  geom_text(aes(label = name), data = city_data[c(16, 53, 124, 7, 24, 77),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
  geom_point(data = city_data[c(16, 53, 124, 7, 24, 77),], color = "red") +
  facet_wrap (~ realm) +
  xlab("eBird Pool Size") + ylab("Birdlife Pool Size")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpSdW4gYGRvd25sb2FkX2RhdGEuUm1kYCBhbmQgYHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3MuUm1kYCBGaXJzdCEKCmBgYHtyfQpjaXR5X2RhdGEKYGBgCgpgYGB7cn0KbGVuZ3RoKGNpdHlfZGF0YSRjaXR5X2dkcF9wZXJfcG9wdWxhdGlvblshaXMubmEoY2l0eV9kYXRhJGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uKV0pCmxlbmd0aChjaXR5X2RhdGEkcGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc1shaXMubmEoY2l0eV9kYXRhJHBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMpXSkKbGVuZ3RoKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmVbIWlzLm5hKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmUpXSkKbGVuZ3RoKGNpdHlfZGF0YSRtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOVshaXMubmEoY2l0eV9kYXRhJG1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5KV0pCmBgYAoKYGBge3J9CmZldGNoX2NpdHlfZGF0YV9mb3IgPC0gZnVuY3Rpb24ocG9vbF9uYW1lLCBpbmNsdWRlX2NpdHlfbmFtZSA9IEYsIGluY2x1ZGVfcG9vbF9zaXplID0gVCkgewogIHJlc3VsdHNfZmlsZW5hbWUgPC0gcGFzdGUocGFzdGUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF8nLCBwb29sX25hbWUsICdjaXR5JywgJ3JpY2huZXNzJywgJ2ludGVyY2VwdCcsIHNlcCA9ICJfIiksICJjc3YiLCBzZXAgPSAiLiIpCiAgcmVzdWx0cyA8LSByZWFkX2NzdihyZXN1bHRzX2ZpbGVuYW1lKQogIAogIGpvaW5lZCA8LSBsZWZ0X2pvaW4oY2l0eV9kYXRhLCByZXN1bHRzKQogIAogIHBvb2xfc2l6ZV9jb2xfbmFtZSA8LSBwYXN0ZShwb29sX25hbWUsICdwb29sJywgJ3NpemUnLCBzZXAgPSAiXyIpCiAgCiAgcmVxdWlyZWRfY29sdW1ucyA8LSBjKCJwb3B1bGF0aW9uX2dyb3d0aCIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21heCIsICJoYXBwaW5lc3NfbmVnYXRpdmVfZWZmZWN0IiwgImhhcHBpbmVzc19wb3NpdGl2ZV9lZmZlY3QiLCAiaGFwcGluZXNzX2Z1dHVyZV9saWZlIiwgIm51bWJlcl9vZl9iaW9tZXMiLCAicmVhbG0iLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMjBrbV9pbmNsdWRlc19lc3R1YXJ5IiwgInJlZ2lvbl81MGttX2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzEwMGttX2luY2x1ZGVzX2VzdHVhcnkiLCAiY2l0eV9pbmNsdWRlc19lc3R1YXJ5IiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyZWdpb25fMTAwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X21heF9wb3BfZGVuc2l0eSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiLCAicmVnaW9uXzIwa21fY3VsdGl2YXRlZCIsICJyZWdpb25fMjBrbV91cmJhbiIsICJyZWdpb25fNTBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl81MGttX3VyYmFuIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzIwa21fbWVhbl9lbGV2YXRpb24iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgInJlZ2lvbl81MGttX21lYW5fZWxldmF0aW9uIiwgInJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzEwMGttX21lYW5fZWxldmF0aW9uIiwgImNpdHlfZWxldmF0aW9uX2RlbHRhIiwgImNpdHlfbWVhbl9lbGV2YXRpb24iLCAidXJiYW4iLCAic2hydWJzIiwgInBlcm1hbmVudF93YXRlciIsICJvcGVuX2ZvcmVzdCIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiaGVyYmFjZW91c192ZWdldGF0aW9uIiwgImN1bHRpdmF0ZWQiLCAiY2xvc2VkX2ZvcmVzdCIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX3N0cmVldHMiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgImNpdHlfbmR2aSIsICJjaXR5X3NzbSIsICJjaXR5X3N1c20iLCAicmVnaW9uXzIwa21fbmR2aSIsICJyZWdpb25fMjBrbV9zc20iLCAicmVnaW9uXzIwa21fc3VzbSIsICJyZWdpb25fNTBrbV9uZHZpIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8xMDBrbV9uZHZpIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAicmVnaW9uXzEwMGttX3N1c20iLCAiY2l0eV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMjBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fNTBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMTAwa21fcGVyY2VudGFnZV9wcm90ZWN0ZWQiKQogIAogIGlmIChpbmNsdWRlX3Bvb2xfc2l6ZSkgewogICAgcmVxdWlyZWRfY29sdW1ucyA8LSBhcHBlbmQoYyhwb29sX3NpemVfY29sX25hbWUpLCByZXF1aXJlZF9jb2x1bW5zKQogIH0KICAKICBpZiAoaW5jbHVkZV9jaXR5X25hbWUpIHsKICAgIHJlcXVpcmVkX2NvbHVtbnMgPC0gYXBwZW5kKGMoIm5hbWUiKSwgcmVxdWlyZWRfY29sdW1ucykKICB9CiAgCiAgcmVxdWlyZWRfY29sdW1ucyA8LSBhcHBlbmQoYygicmVzcG9uc2UiKSwgcmVxdWlyZWRfY29sdW1ucykKICAKICBqb2luZWRbLHJlcXVpcmVkX2NvbHVtbnNdCn0KYGBgCgoKYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGEgPC0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignbWVybGluJykKbWVybGluX2NpdHlfZGF0YQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShycGFydCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmxpYnJhcnkobXVsdGNvbXApCmxpYnJhcnkoY2FyKQpgYGAKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkIDwtIHJmSW1wdXRlKHJlc3BvbnNlIH4gLiwgbWVybGluX2NpdHlfZGF0YSkKbWVybGluX2NpdHlfZGF0YV9maXhlZApgYGAKCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9maXhlZCwgYWVzKHJlc3BvbnNlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDIpCmBgYAoKYGBge3J9CnNvdXJjZSgnLi9oZWxwZXJfX3JhbmRvbV9mb3Jlc3Rfc2VsZWN0aW9uX2Z1bmN0aW9ucy5SJykKYGBgCgpgYGB7cn0Kc2NhbGVfcGFyYW1ldGVyX25hbWUgPC0gZnVuY3Rpb24oc2NhbGUsIHBvc3RzY3JpcHQpIHsKICBwYXN0ZSgncmVnaW9uJywgcGFzdGUoc2NhbGUsICdrbScsIHNlcCA9ICcnKSwgcG9zdHNjcmlwdCwgc2VwID0gJ18nKSAgCn0KCnNjYWxlX3BhcmFtZXRlcnMgPC0gZnVuY3Rpb24ocG9zdHNjcmlwdCkgewogIGMoc2NhbGVfcGFyYW1ldGVyX25hbWUoMjAsIHBvc3RzY3JpcHQpLCBzY2FsZV9wYXJhbWV0ZXJfbmFtZSg1MCwgcG9zdHNjcmlwdCksIHNjYWxlX3BhcmFtZXRlcl9uYW1lKDEwMCwgcG9zdHNjcmlwdCkpCn0KCnNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQgPC0gZnVuY3Rpb24oc2NhbGVfdG9fZXhjbHVkZSwgcG9zdHNjcmlwdCkgewogIHNjYWxlcyA8LSBzY2FsZV9wYXJhbWV0ZXJzKHBvc3RzY3JpcHQpCiAgc2NhbGVzW3NjYWxlcyAhPSBzY2FsZV9wYXJhbWV0ZXJfbmFtZShzY2FsZV90b19leGNsdWRlLCBwb3N0c2NyaXB0KV0KfQoKc2VsZWN0X3NjYWxlcyA8LSBmdW5jdGlvbih1cmJhbiwgY3VsdGl2YXRlZCwgZWxldmF0aW9uX2RlbHRhLCBtZWFuX2VsZXZhdGlvbiwgYXZlcmFnZV9wb3BfZGVuc2l0eSwgaW5jbHVkZXNfZXN0dWFyeSwgc3NtLCBzdXNtLCBuZHZpLCBwZXJjZW50YWdlX3Byb3RlY3RlZCkgewogIGFwcGVuZCgKICAgIGFwcGVuZCgKICAgICAgYXBwZW5kKAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHVyYmFuLCBwb3N0c2NyaXB0ID0gJ3VyYmFuJyksCiAgICAgICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBjdWx0aXZhdGVkLCBwb3N0c2NyaXB0ID0gJ2N1bHRpdmF0ZWQnKQogICAgICAgICksCiAgICAgICAgYXBwZW5kKAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gZWxldmF0aW9uX2RlbHRhLCBwb3N0c2NyaXB0ID0gJ2VsZXZhdGlvbl9kZWx0YScpLAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gbWVhbl9lbGV2YXRpb24sIHBvc3RzY3JpcHQgPSAnbWVhbl9lbGV2YXRpb24nKQogICAgICAgICkKICAgICAgKSwKICAgICAgYXBwZW5kKAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IGF2ZXJhZ2VfcG9wX2RlbnNpdHksIHBvc3RzY3JpcHQgPSAnYXZlcmFnZV9wb3BfZGVuc2l0eScpLAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gaW5jbHVkZXNfZXN0dWFyeSwgcG9zdHNjcmlwdCA9ICdpbmNsdWRlc19lc3R1YXJ5JykKICAgICAgICApLAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHNzbSwgcG9zdHNjcmlwdCA9ICdzc20nKSwKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHN1c20sIHBvc3RzY3JpcHQgPSAnc3VzbScpCiAgICAgICAgKQogICAgICApCiAgICApLAogICAgYXBwZW5kKAogICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBuZHZpLCBwb3N0c2NyaXB0ID0gJ25kdmknKSwKICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gcGVyY2VudGFnZV9wcm90ZWN0ZWQsIHBvc3RzY3JpcHQgPSAncGVyY2VudGFnZV9wcm90ZWN0ZWQnKQogICAgKQogICkKfQpgYGAKCmBgYHtyfQpzZWxlY3Rfc2NhbGVzKHVyYmFuID0gMjAsIGN1bHRpdmF0ZWQgPSAxMDAsIGVsZXZhdGlvbl9kZWx0YSA9IDIwLCBtZWFuX2VsZXZhdGlvbiA9IDEwMCwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9IE5BLCBpbmNsdWRlc19lc3R1YXJ5ID0gTkEsIHNzbSA9IDIwLCBzdXNtID0gMjAsIG5kdmkgPSAxMDAsIHBlcmNlbnRhZ2VfcHJvdGVjdGVkID0gTkEpCmBgYAoKc2VsZWN0X3NjYWxlcyh1cmJhbiA9ICwgY3VsdGl2YXRlZCA9ICwgZWxldmF0aW9uX2RlbHRhID0gLCBtZWFuX2VsZXZhdGlvbiA9ICwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9ICwgaW5jbHVkZXNfZXN0dWFyeSA9ICwgc3NtID0gLCBzdXNtID0gLCBuZHZpID0sIHBlcmNlbnRhZ2VfcHJvdGVjdGVkID0gKQoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQpCmBgYAoKYGBge3J9CmV4Y2x1ZGVfbWVybGluIDwtICFuYW1lcyhtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkKSAlaW4lIHNlbGVjdF9zY2FsZXModXJiYW4gPSAyMCwgY3VsdGl2YXRlZCA9IDEwMCwgZWxldmF0aW9uX2RlbHRhID0gNTAsIG1lYW5fZWxldmF0aW9uID0gMjAsIGF2ZXJhZ2VfcG9wX2RlbnNpdHkgPSA1MCwgaW5jbHVkZXNfZXN0dWFyeSA9IE5BLCBzc20gPSAxMDAsIHN1c20gPSA1MCwgbmR2aSA9IDIwLCBwZXJjZW50YWdlX3Byb3RlY3RlZCA9IDUwKQoKbWVybGluX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUgPC0gbWVybGluX2NpdHlfZGF0YV9maXhlZFssZXhjbHVkZV9tZXJsaW5dCm1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfc2luZ2xlX3NjYWxlCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfc2luZ2xlX3NjYWxlKQpgYGAKCmBgYHtyfQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicGVybWFuZW50X3dhdGVyIiwgInJlZ2lvbl81MGttX3N1c20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIiwgICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJoYXBwaW5lc3NfcG9zaXRpdmVfZWZmZWN0IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicGVybWFuZW50X3dhdGVyIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzIwa21fbmR2aSIsICJyZWdpb25fMjBrbV91cmJhbiIsICJzaHJ1YnMiLCAgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgImhhcHBpbmVzc19wb3NpdGl2ZV9lZmZlY3QiLCAiY2l0eV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIiwgICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJoYXBwaW5lc3NfcG9zaXRpdmVfZWZmZWN0IiwgImNpdHlfcGVyY2VudGFnZV9wcm90ZWN0ZWQiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgImNpdHlfbmR2aSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgIm1lcmxpbl9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWFsbSIsICJyZWdpb25fMTAwa21fc3NtIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicGVybWFuZW50X3dhdGVyIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzIwa21fbmR2aSIsICJyZWdpb25fMjBrbV91cmJhbiIsICJzaHJ1YnMiLCAgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgImhhcHBpbmVzc19wb3NpdGl2ZV9lZmZlY3QiLCAiY2l0eV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWF4IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIiwgInJlZ2lvbl8xMDBrbV9zc20iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgICJyYWluZmFsbF9tb250aGx5X21pbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmVnaW9uXzUwa21fc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInNocnVicyIsICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInJlZ2lvbl81MGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iLCAicmVnaW9uXzEwMGttX3NzbSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInBlcm1hbmVudF93YXRlciIsICJyZWdpb25fNTBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX25kdmkiLCAicmVnaW9uXzIwa21fdXJiYW4iLCAic2hydWJzIiwgICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJoYXBwaW5lc3NfcG9zaXRpdmVfZWZmZWN0IiwgImNpdHlfcGVyY2VudGFnZV9wcm90ZWN0ZWQiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21heCIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIpXSkKYGBgCgoibWVybGluX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlYWxtIgoKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGEgPC0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignYmlyZGxpZmUnKQpiaXJkbGlmZV9jaXR5X2RhdGEKYGBgCgpgYGB7cn0KZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YSwgYWVzKHJlc3BvbnNlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCA8LSByZkltcHV0ZShyZXNwb25zZSB+IC4sIGJpcmRsaWZlX2NpdHlfZGF0YSkKYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCkKYGBgCgpgYGB7cn0KZXhjbHVkZV9iaXJkbGlmZSA8LSAhbmFtZXMoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkKSAlaW4lIHNlbGVjdF9zY2FsZXModXJiYW4gPSAxMDAsIGN1bHRpdmF0ZWQgPSAxMDAsIGVsZXZhdGlvbl9kZWx0YSA9IDIwLCBtZWFuX2VsZXZhdGlvbiA9IDEwMCwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9IDIwLCBpbmNsdWRlc19lc3R1YXJ5ID0gTkEsIHNzbSA9IDUwLCBzdXNtID0gMTAwLCBuZHZpID0gMTAwLCBwZXJjZW50YWdlX3Byb3RlY3RlZCA9IDEwMCkKCmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxleGNsdWRlX2JpcmRsaWZlXQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfc2luZ2xlX3NjYWxlCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUpCmBgYAoKYGBge3J9CmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiLCAicmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJzaHJ1YnMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInNocnVicyIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJlZ2lvbl8xMDBrbV9zdXNtIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicGVybWFuZW50X3dhdGVyIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiLCAic2hydWJzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIsICJjaXR5X3N1c20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJiaXJkbGlmZV9wb29sX3NpemUiLCAiYmlvbWVfbmFtZSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlcyIsICJyYWluZmFsbF9tb250aGx5X21pbiIsICJyZWdpb25fMTAwa21fc3VzbSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInBlcm1hbmVudF93YXRlciIsICJyYWluZmFsbF9tb250aGx5X21heCIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInNocnVicyIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX3N0cmVldHMiLCAicmFpbmZhbGxfYW5udWFsX2F2ZXJhZ2UiLCAiY2l0eV9zdXNtIiwgInJlZ2lvbl8xMDBrbV9uZHZpIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAicmFpbmZhbGxfbW9udGhseV9taW4iLCAicmVnaW9uXzEwMGttX3N1c20iLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAicmFpbmZhbGxfbW9udGhseV9tYXgiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiLCAicmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJzaHJ1YnMiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19zdHJlZXRzIiwgInJhaW5mYWxsX2FubnVhbF9hdmVyYWdlIiwgImNpdHlfc3VzbSIsICJyZWdpb25fMTAwa21fbmR2aSIsICJoYXBwaW5lc3NfZnV0dXJlX2xpZmUiKV0pCgpgYGAKCiJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAiYmlyZGxpZmVfcG9vbF9zaXplIgoKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU28uLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNZXJsaW46ICJtZXJsaW5fcG9vbF9zaXplIiwgImJpb21lX25hbWUiLCAicmVhbG0iCkJpcmRsaWZlOiAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIKCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHJ5IE1vZGVsbGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmxpYnJhcnkoYm9vdCkKYGBgCgoKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX25hbWVkIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ21lcmxpbicsIFQpCmJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdiaXJkbGlmZScsIFQpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClVzZSBjcm9zcyB2YWxpZGF0aW9uIGFuZCBkcm9wcGluZyB0ZXJtcyB0byBmaW5kIGJlc3QgbW9kZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIENhbiB3ZSBkcm9wIG9uZT8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcG9wdWxhdGlvbl9ncm93dGggKyByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcG9wdWxhdGlvbl9ncm93dGggKyByZWdpb25fNTBrbV9zc20gKyByZWFsbSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBwb3B1bGFpb25fZ3Jvd3RoICgxNC4zMDM4NCkKCi0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHJlZ2lvbl81MGttX3NzbSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBzc20gKDE0LjIwODg5KQoKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgYmlvbWVfbmFtZSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSArIHJlYWxtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaW9tZV9uYW1lICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBiaW9tZSAoMTMuMTAxMzEpCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gbWVybGluX3Bvb2xfc2l6ZSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IG1lcmxpbl9wb29sX3NpemUgKiByZWFsbSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBiZXN0IG1vZGVsIHdpdGggbWVybGluIGlzIHBvb2wgc2l6ZSArIHJlYWxtIChDViBlcnJvciAxMy4xMDEzMSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfZml4ZWQkcmVhbG0gPC0gZmFjdG9yKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQkcmVhbG0sIGxldmVscyA9IGMoIlBhbGVhcmN0aWMiLCAiTmVhcmN0aWMiLCAiQXVzdHJhbGFzaWEiLCAiSW5kb21hbGF5YW4iLCAiTmVvdHJvcGljIiwgIkFmcm90cm9waWMiKSkKc3VtbWFyeShnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IG1lcmxpbl9wb29sX3NpemUgKyByZWFsbSkpCmBgYAoKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gY2FuIHdlIGRyb3AgYSB2YXJpYWJsZT8KCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgcmVhbG0sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyBwb3B1bGF0aW9uX2dyb3d0aCArIGJpb21lX25hbWUgKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHJlZ2lvbl81MGttX3NzbSArIGJpb21lX25hbWUgKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBiaW9tZSAoNS40OTI1MzYpCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyBwb3B1bGF0aW9uX2dyb3d0aCArIHJlZ2lvbl81MGttX3NzbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVhbG0sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWdpb25fNTBrbV9zc20gKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHBvcHVsYXRpb25fZ3Jvd3RoICsgcmVnaW9uXzUwa21fc3NtICsgcmVhbG0sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHBvcHVsYXRpb24gZ3Jvd3RoICg1LjM4NjA5KQpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWdpb25fNTBrbV9zc20sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBzc20gKDUuMzgwMzMpCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWFsbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSAqIHJlYWxtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIHNvIGJlc3QgbW9kZWwgd2l0aCBiaXJkbGlmZSBpcyBwb29sIHNpemUgKyByZWFsbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkJHJlYWxtIDwtIGZhY3RvcihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQkcmVhbG0sIGxldmVscyA9IGMoIlBhbGVhcmN0aWMiLCAiTmVhcmN0aWMiLCAiQXVzdHJhbGFzaWEiLCAiSW5kb21hbGF5YW4iLCAiTmVvdHJvcGljIiwgIkFmcm90cm9waWMiKSkKc3VtbWFyeShnbG0oZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gYmlyZGxpZmVfcG9vbF9zaXplICsgcmVhbG0pKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVhbG0sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpCmBgYAoKYGBge3J9CmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSBtZXJsaW5fcG9vbF9zaXplLCB5ID0gcmVzcG9uc2UpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBzZSA9IEYpICsgZmFjZXRfd3JhcCh+IHJlYWxtKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSBiaXJkbGlmZV9wb29sX3NpemUsIHkgPSByZXNwb25zZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gRikgKyBmYWNldF93cmFwKH4gcmVhbG0pCmBgYAoKYGBge3J9CmJpcmRsaWZlLmZpdCA8LSBnbG0oZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHJlYWxtKQpzdW1tYXJ5KGJpcmRsaWZlLmZpdCkKd2l0aChzdW1tYXJ5KGJpcmRsaWZlLmZpdCksIDEgLSBkZXZpYW5jZS9udWxsLmRldmlhbmNlKQpwbG90KGJpcmRsaWZlLmZpdCkKYGBgCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDE2LCA1MywgMTE2LCAxMjMpLCBjKCJuYW1lIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIpXQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSBiaXJkbGlmZV9wb29sX3NpemUsIHkgPSByZXNwb25zZSkpICsgCiAgZ2VvbV9wb2ludChzaXplPTEpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gRikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygxNiwgNTMsIDEyMyksXSwgc2l6ZSA9IDMsIHBvc2l0aW9uID0gImRvZGdlIiwgdmp1c3QgPSAiaW53YXJkIiwgaGp1c3QgPSAiaW53YXJkIiwgY29sb3IgPSAicmVkIiwgYW5nbGU9LTE1KSArCiAgZ2VvbV9wb2ludChkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDE2LCA1MywgMTIzKSxdLCBjb2xvciA9ICJyZWQiKSArCiAgZmFjZXRfd3JhcCh+IHJlYWxtKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiQ2l0eSBSYW5kb20gRWZmZWN0IEludGVyY2VwdCIpICsgeGxhYigiUmVnaW9uYWwgUG9vbCBTaXplIikgKyBsYWJzKHRpdGxlID0gIkJpcmRsaWZlIikKCmdnc2F2ZSgiY2l0eV9lZmZlY3RfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmUuanBnIikKYGBgCgpgYGB7cn0KbWVybGluLmZpdCA8LSBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVhbG0pCnN1bW1hcnkobWVybGluLmZpdCkKd2l0aChzdW1tYXJ5KG1lcmxpbi5maXQpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKcGxvdChtZXJsaW4uZml0KQpgYGAKCmBgYHtyfQpjaXR5X2RhdGFbYyg3LCAyNCwgNzcpLCBjKCJuYW1lIiwgImJpcmRsaWZlX3Bvb2xfc2l6ZSIsICJtZXJsaW5fcG9vbF9zaXplIildCmBgYAoKYGBge3J9CmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSBtZXJsaW5fcG9vbF9zaXplLCB5ID0gcmVzcG9uc2UpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gRikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsW2MoNywgMjQsIDc3KSxdLCBzaXplID0gMywgcG9zaXRpb24gPSAiZG9kZ2UiLCB2anVzdCA9ICJpbndhcmQiLCBoanVzdCA9ICJpbndhcmQiLCBjb2xvciA9ICJyZWQiLCBhbmdsZT0tMTUpICsKICBnZW9tX3BvaW50KGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDcsIDI0LCA3NyksXSwgY29sb3IgPSAicmVkIikgKwogIGZhY2V0X3dyYXAofiByZWFsbSkgKwogIHRoZW1lX2J3KCkgKwogIHlsYWIoIkNpdHkgUmFuZG9tIEVmZmVjdCBJbnRlcmNlcHQiKSArIHhsYWIoIlJlZ2lvbmFsIFBvb2wgU2l6ZSIpICsgbGFicyh0aXRsZSA9ICJlQmlyZCIpCgpnZ3NhdmUoImNpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX21lcmxpbi5qcGciKQpgYGAKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMgPC0gcmVzaWQobWVybGluLmZpdCkKZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMoeSA9IHJlc3BvbnNlLCB4ID0gcmVzaWR1YWxzKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHJlYWxtKSkgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDcsIDI0LCA3NyksXSwgc2l6ZSA9IDQsIHBvc2l0aW9uID0gImRvZGdlIiwgdmp1c3QgPSAiaW53YXJkIiwgaGp1c3QgPSAiaW53YXJkIikgKyAKICBsYWJzKHRpdGxlID0gIk1lcmxpbiIsIHN1YnRpdGxlID0gcGFzdGUoIkNvcnJlbGF0aW9uIiwgY29yKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscywgbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzcG9uc2UpKSkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMgPC0gcmVzaWQoYmlyZGxpZmUuZml0KQpnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHkgPSByZXNwb25zZSwgeCA9IHJlc2lkdWFscykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCBhbHBoYSA9IDAuNSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcmVhbG0pKSArIAogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygxNiwgNTMsIDEyNCksXSwgc2l6ZSA9IDQsIHBvc2l0aW9uID0gImRvZGdlIiwgdmp1c3QgPSAiaW53YXJkIiwgaGp1c3QgPSAiaW53YXJkIikgKwogIGxhYnModGl0bGUgPSAiQmlyZGxpZmUiLCBzdWJ0aXRsZSA9IHBhc3RlKCJDb3JyZWxhdGlvbiIsIGNvcihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscywgYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNwb25zZSkpKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQgPC0gcmVzaWQobG0ocmVzcG9uc2UgfiByZXNpZHVhbHMsIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKQpnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSByZWFsbSwgeSA9IHJlc2lkdWFsc19vZl9maXQpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9CmJpcmRsaWZlLmFvdiA8LSBhb3YoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0IH4gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkKc3VtbWFyeShiaXJkbGlmZS5hb3YpCmBgYAoKYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQgPC0gcmVzaWQobG0ocmVzcG9uc2UgfiByZXNpZHVhbHMsIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkKZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMoeCA9IHJlYWxtLCB5ID0gcmVzaWR1YWxzX29mX2ZpdCkpICsgZ2VvbV9ib3hwbG90KCkKYGBgCgpgYGB7cn0KbWVybGluLmFvdiA8LSBhb3YobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzX29mX2ZpdCB+IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlYWxtKQpzdW1tYXJ5KG1lcmxpbi5hb3YpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyhyZXNpZHVhbHMpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkKYGBgCgpgYGB7cn0KZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyhyZXNpZHVhbHMpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkKYGBgCgpgYGB7cn0Kc2hhcGlyby50ZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzcG9uc2UpCnNoYXBpcm8udGVzdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscykKc2hhcGlyby50ZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzX29mX2ZpdCkKCnNoYXBpcm8udGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNwb25zZSkKc2hhcGlyby50ZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscykKc2hhcGlyby50ZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQpCmBgYAoKVmFyaWFuY2VzIG9mIGdyb3VwcyBhcmUgTk9UIHNpZ25pZmljYW50bHkgZGlmZmVyZW50OgpgYGB7cn0KYmFydGxldHQudGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMsIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlYWxtKSAKbGV2ZW5lVGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMsIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlYWxtKSAKYGBgCgpWYXJpYW5jZXMgb2YgZ3JvdXBzIGFyZSBOT1Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQ6CmBgYHtyfQpiYXJ0bGV0dC50ZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzLCBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlYWxtKSAKbGV2ZW5lVGVzdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscywgYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmBgYAoKVmFyaWFuY2VzIG9mIGdyb3VwcyBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQ6CmBgYHtyfQpiYXJ0bGV0dC50ZXN0KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFsc19vZl9maXQsIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlYWxtKSAKbGV2ZW5lVGVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0LCBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmBgYAoKVmFyaWFuY2VzIG9mIGdyb3VwcyBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQ6CmBgYHtyfQpiYXJ0bGV0dC50ZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzX29mX2ZpdCwgYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZWFsbSkgCmxldmVuZVRlc3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHNfb2ZfZml0LCBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlYWxtKSAKYGBgCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGVjayBBSUMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CkFJQygKICBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IG1lcmxpbl9wb29sX3NpemUgKyBwb3B1bGF0aW9uX2dyb3d0aCArIHJlZ2lvbl81MGttX3NzbSArIGJpb21lX25hbWUgKyByZWFsbSksCiAgZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiBtZXJsaW5fcG9vbF9zaXplICsgcmVhbG0pCikKYGBgCgpgYGB7cn0KQUlDKAogIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiBiaXJkbGlmZV9wb29sX3NpemUgKyBwb3B1bGF0aW9uX2dyb3d0aCArIHJlZ2lvbl81MGttX3NzbSArIGJpb21lX25hbWUgKyByZWFsbSksCiAgZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IGJpcmRsaWZlX3Bvb2xfc2l6ZSArIHJlYWxtKQopCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb21wYXJlIG91dGxpZXJzIGJldHdlZW4gdHdvIHBvb2wgc2l6ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGB7cn0KZ2dwbG90KGNpdHlfZGF0YSwgYWVzKHggPSBtZXJsaW5fcG9vbF9zaXplLCB5ID0gYmlyZGxpZmVfcG9vbF9zaXplKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKHNlID0gRiwgbWV0aG9kID0gImxtIikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgZGF0YSA9IGNpdHlfZGF0YVtjKDE2LCA1MywgMTI0LCA3LCAyNCwgNzcpLF0sIHNpemUgPSAzLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHZqdXN0ID0gImlud2FyZCIsIGhqdXN0ID0gImlud2FyZCIsIGNvbG9yID0gInJlZCIsIGFuZ2xlPS0xNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGNpdHlfZGF0YVtjKDE2LCA1MywgMTI0LCA3LCAyNCwgNzcpLF0sIGNvbG9yID0gInJlZCIpICsKICBmYWNldF93cmFwICh+IHJlYWxtKSArCiAgeGxhYigiZUJpcmQgUG9vbCBTaXplIikgKyB5bGFiKCJCaXJkbGlmZSBQb29sIFNpemUiKQpgYGA=